num2=document.getElementById('num2').value;
num3=num/num2;
num4=num%num2;
num5=num4/num2;
num6=num3-num5;
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num6+' עם שארית '+num4+'.';}
אז ככה. יש 2 תיבות טקסט, בתבנית של "num לחלק ל-num2".
אם הכנסתי מספר כלשהו בשניהם ולחצתי אנטר:
- נוצר משתנה בשם num3 שיהיה שווה ערך ל-num לחלק ל-num2.
- לאחר מכן נוצר משתנה בשם num4 שכולל את השארית של חילוק של num ב-num2 (נניח שזה היה 7 וחילקנו ב-2, השארית היא 1 והתוצאה 3).
- לאחר מכן, משתנה בשם num5 שמכיל את השארית הכוללת לחלק למה שחילקנו בו. (כלומר, נניח היה לנו 7, חילקנו ב-3, התוצאה הייתה 2 עם שארית 1. חילקנו את שארית 1 ל-3, כך ש-num5 מכיל שליש).
- נוצר משתנה בשם num6, שהוא התוצר הסופי שמכיל את תוצאת החילוק פחות השארית של עצמו.
- מוצג משתנה num6, שהוא התוצאה, ומשתנה num4 שהוא השארית.
נניח שהיה לנו 49 וחילקנו אותו ב-2, אז:
num=49
num2=2
num3=24.5
num4=1
num5=0.5
num6=24
כך שיוצא לנו נכון. 49 לחלק ל-2 (במטרה למצוא שלם ושארית) שווה 24 עם שארית 1.
(המטרה בכל זה היא שזה ישמש ככלי עזר להמרה מבסיס לבסיס, אבל זה לא משנה).
בקיצור, הבעיה.
הקלדתי 58 לחלק ל-12, וקיבלתי:
התוצאה היא 3.9999999999999996 עם שארית 10.
מה שאומר שיש בעיה. התוצאה אמורה להיות שלמה.
אשמח שתתקנו אותי במה טעיתי.
לחצו כאן בכדי להגיע לדמו.
תודה מראש. :)
19 תשובות
num 2 = "12"
num 3 = 4.33333333
למה זה קורה? כי מחולקת פה מחרוזת במחרוזת.
כמה לדעתך יוצא לחקל "פרה" ב"מכונית" ?
כדי להפוך מחרוזת מספר יש להישתמש בפונקציה parseInt בצורה הבאה:
num 2 = parseInt(num2, 10);
שים לב לפרמטר השניה, זה בסיס ספירה. אתה בטח שמעת על זה שיש בסיס ספירה עשרוני, הרגיל, בסיס בינארי, אוקטאלי עוד מלא בסיסים שונים :)
אל תשכח אותו, אחרת תקבל תוצאה בבסיס 8.
ובונוס, כשמחלקים פרה במכונית המחשב מתרגם את האותיות לערכים המספריים שלהם ועושה חילוק עליהם, בגלל זה התוצה שאנחנו רואים.
למען האמת, זה עבד לי כמו שצריך בכל מספר שכתבתי חוץ מ-58, שבו יוצא:
num: 58
num2: 12
num3: 4.833333333333333
num4: 10
num5: 0.8333333333333334
num6: 3.9999999999999996
ניסיתי גם עם ה-parseInt כפי שאמרת, לא עזר.
טעות שלי. הכל עובד נכון.
הסיבה שאתה לא מקבל מספר שלם היא זה, שהמחשב מוגבל בזיכרון ובכמות הפסרות אחרי הנקוד העשרונית.
למספר 4.8333 אין אין סוף ספרות 3 אחרי הנקודה, לכן המחשב מעגל את זה ל 48334 אחרי כמה פעמים של שלוש.
למספר 3.99999 יש אין סוף ספרות 9 בסוף, לכן המחש מעגל את זה ל 3.9990
ואז בחיסור אתה מקבל בסוף משהו עם 6.
למה אחד הוא מעגל למעלה ולמה אחד למעטה או לאיזה כיוון הוא יעגל את המספר אני כרגע לא יודע בוודאות. אני יבדוק את זה ויוסיף לפה ביומיים שלושה הקרובים עוד תשובה.
בינתיים לקבל את המספר השלם מתוצאת חילוק אפשר עם
אחכה לתשובתך, תודה רבה לך. :)
ואגב, אמרת לקבל את המספר השלם בעזרת מה שכתבת? זה לאו דווקא שלם, יכול להיות גם עם נקודה עשרונית...
המטרה הסופית של האלגוריטם שלך הוא לקבל את מספר השלם, לא ?
בכל אופן, אני יבדוק לפי מה המחשב מחליט לאן לעגל את המספר.
מספר שלם ושארית (שהם נכונים). :)
נכון, אבל זה לא מחזיר לי מספר שלם...
58/12=4.833333333333333
כי התוצאה היא לא מספר שלם. אם אתה רוצה רק את החלק השלם - תשתמש ב parseInt
אני חושש שיש לי מחסור חמור בידע בסיסי במתמטיקה. אז אין סיכוי שעיגול כלפי מטה יביא תוצאה לא נכונה?
והאם הקוד הבא בסדר? (והאם בכלל יש צורך במשפט התנאי? ולמה הוא עבד ב58/12, ולא החזיר לי את השגיאה שכתבתי בתנאי - בניגוד לבעיות הקודמות איתו והנקודה הצפה?):
num=document.getElementById('num').value;
num2=document.getElementById('num2').value;
num3=num/num2;
num4=Math.floor(num3);
num5=num%num2;
num6=num5/num2;
num7=num6+num4;
if (num7!=num3) {
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num4+' עם שארית '+num5+'.<br /><span style="color: red">יש חשש שהפיתרון שיצא לך שגוי.</sapn>';
}
else{
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num4+' עם שארית '+num5+'.';}
}
אין לי שמץ של מושג מה אתה מנסה לעשות עם הקוד הזה, אבל הראתי לך פעממים כבר איך לקבל את השלם מפעולת חילוק ואיך לקבל את השאית, כל אחד בנפרד.
המטרה היא שנניח יש לך 983 בבסיס עשרוני ואתה רוצה להמיר אותו להקסדצימלי ואתה רוצה להשתמש בשיטה המסוימת הזו, שאתה עושה:
983 לחלק ל-16.
61 עם שארית 7. 7.
61 לחלק ל-16.
3 עם שארית 13. D7.
0 עם שארית 3. 3D7.
3D7 בהקסדצימלי באמת מייצג 983 בעשרוני.
עקרונית, זה נועד עבור סוג של הסבר למעבר בין בסיסים. (כי אחרי הכל, לא כולם יכולים לחלק תוך שנייה מספר ב-16 ולמצוא שלם ושארית, בניגוד לחילוק ב-2 עבור בסיס בינארי).
בסדר גמור. אני יאמר עוד פעם. זה הקוד למצוא שארית ושלם מחילוק של שני ספרות ממה שאתה רוצה, במה שאתה רוצה:
num2 = 12;
alert(' השלם ' + parseInt(num1 / num2, 10));
alert('שארית' + (num1%num2));
parseInt תמיד יעגל כלפי מטה?
בכל מקרה, כתבתי קוד שעובד כמו שצריך:
num2=parseInt(document.getElementById('num2').value, 10);
num3=num1/num2;
num3=Math.floor(num3);
num4=num1%num2;
document.getElementById('result').innerHTML='בחרת לחלק את המספר '+num1+' במספר '+num2+' ולמצוא שלם ושארית.<br />התוצאה היא '+num3+' עם שארית '+num4+'.';
אני חייב לשים שם את ה-parseInt? הוא הורס אם יש, נניח, 0.
אם יש 0 איפה? אצלי הוא עובד גם עם 0.
אם אתה מדבר על, נגיד, 0123 ? אז זה כבר רישום בבסיס ספירה אוקטאלי.
באופן כללי, הוא רצוי, אבל לא חובה. יעבוד גם בלעדיו.
אוקיי, תודה. :)
ואם נניח:
"בחרת לחלק את המספר 123 במספר 0 ולמצוא שלם ושארית.
התוצאה היא Infinity עם שארית NaN."
איך הוא הגיע למספר אין סופי ולמשהו שהוא לא מספר?
ыמה התוצאה שהיית מצפה לקבל? :)
הוא עושה חילוק במספר "ששואף לאפס" (lim -> 0) ואתה מקבל אינסוף
השארית בהתאם.
בכל אופן תבדוק שמזינים לך משהו ששונה מאפס. חילוק ב 0 זה פעולה אסורה. יכול להיות שדפדנים אחרים בכלל עפים עם שגיאה באותו מקום.
השועל, כרום, וזה-שאין-לנקוב-בשמו החזירו לי את אותו הדבר. :)
שוב תודה XD